package scau.cn;

import java.util.ArrayList;
import java.util.Iterator;

import scau.cn.component.domain.FileN;

/**
 * 最多五个打开
 *
 * @author xiao
 * @date 2019/11/23 下午 5:53
 */
public class OpenedFileTable {
	/**
	 * 存放已打开的文件
	 */
	private ArrayList<OpenedFileTableItem> listOfItem = new ArrayList<>();

	private static OpenedFileTable openedFileTable = null;

	// ------------------------------构造器----------------------------------
	private OpenedFileTable() {
	}

	// ---------------------------修改器，访问器--------------------------------
	public ArrayList<OpenedFileTableItem> getListOfItem() {
		return listOfItem;
	}

	public void setListOfItem(ArrayList<OpenedFileTableItem> listOfItem) {
		this.listOfItem = listOfItem;
	}

	// ---------------------------方法--------------------------------------
	public static OpenedFileTable getOpenedFileTable() {
		if (openedFileTable == null) {
			openedFileTable = new OpenedFileTable();
		}
		return openedFileTable;
	}

	/**
	 * 根据文件删除在已打开文件表中的文件
	 * 
	 * @param file
	 */
	public void remove(FileN file) throws Exception {
		int error = 1;
		Iterator iterator = listOfItem.iterator();
		OpenedFileTableItem oft;
		for (int i = 0; i < listOfItem.size(); i++) {
			oft = listOfItem.get(i);
			if (file.findPath().equals(oft.getFilePath())) {
				listOfItem.remove(oft);
				error = 0;
				break;
			}
		}
		if (error == 1 || listOfItem.size() >= 5) {
			throw new Exception("该文件还未打开，或者已打开数目超过5");
		}
	}

	/**
	 * 根据传入的文件，加入到表中
	 * 
	 * @param file
	 */
	public void add(FileN file) {
		// 先判断该文件是否已经打开
		if (!judgeExist(file)) {
			OpenedFileTableItem oft = new OpenedFileTableItem(file);
			listOfItem.add(oft);
		}
	}

	/**
	 * 判断文件是否存在: 根据传入文件的开始磁盘块号判断该文件是够已经在已打开文件表中存在
	 * 
	 * @param file
	 * @return true:如果存在文件则返回true false:如果不存在文件就返回false
	 * @author 严浩强
	 */
	public boolean judgeExist(FileN file) {
		OpenedFileTableItem oft;
		for (int i = 0; i < listOfItem.size(); i++) {
			oft = listOfItem.get(i);
			if (oft.getStart() == file.getStart()) {
				return true;
			}
		}
		return false;
	}
}
